Recent advances in computer performance have enabled graphic systems to provide more realistic graphical images using personal computers, home video game computers, handheld devices, and the like. In such graphic systems, a number of procedures are executed to “render” or draw graphic primitives to the screen of the system. A “graphic primitive” is a basic component of a graphic picture, such as a point, line, polygon, or the like. Rendered images are formed with combinations of these graphic primitives. Many procedures may be utilized to perform 3D graphics rendering.
Specialized graphics processing units (e.g., GPUs, etc.) have been developed to optimize the computations required in executing the graphics rendering procedures. The GPUs are configured for high-speed operation and typically incorporate one or more rendering pipelines. Each pipeline includes a number of hardware-based functional units that are optimized for high-speed execution of graphics instructions/data, where the instructions/data are fed into the front end of the pipeline and the computed results emerge at the back end of the pipeline. The hardware-based functional units, cache memories, firmware, and the like, of the GPU are optimized to operate on the low-level graphics primitives (e.g., comprising “points”, “lines”, “triangles”, etc.) and produce real-time rendered 3D images.
A problem exists however with the ability of prior art 3D rendering architectures to efficiently handle high-quality anti-aliasing of the complex 3D scenes of modern real-time 3D applications. Traditional low cost 3D graphics rendering systems generate images in which polygonal edges appear jagged or “aliased”. Aliasing artifacts result from the fact that the images are drawn against a finite resolution grid of pixels of a frame buffer. A continuous image is sampled at discreet pixel centers and displayed on a finite resolution screen. Anti-aliasing is an image quality enhancing method that reduces aliasing effects apparent in the rendered image and gives the polygonal edges a much smoother appearance.
In general, anti-aliasing functions are implemented in the rasterization stage of a typical 3D graphics rendering pipeline. The rasterization stage determines which polygon fragments belong to which discreet pixels of the display. A fragment is a portion of a primitive (e.g., polygon, etc.) that covers a pixel. A pixel may contain fragments from many polygons, with each polygon typically covering more than one pixel. A pixel has a finite area and is generally considered to have square shape.
The implementation of high-quality anti-aliasing imposes a heavy computational burden on the graphics rendering pipeline. Each fragment belonging to a pixel contributes its color to the overall color of the pixel. A primary factor in this contribution is the area of the fragment. The color of a pixel is a weighted blend of colors of all fragments contained within the pixel. The fragment area is used as a blending weight. Thus, the fragment area plays a very important role in the anti-aliasing process, and therefore an accurate computation of the fragment area is required. However, computing fragment area directly from its shape is very processor intensive, since the shape of a fragment can vary depending upon the polygon's shape and orientation.
The high computational burden required for high-quality anti-aliasing has led to a number of prior art shortcut schemes to provide anti-aliased image quality while reducing the computational workload. Such schemes involve, for example, the use of coverage masks, the use of multiple sample points per pixel, and the like. However each of these prior art schemes involve trade-offs in the accuracy of the estimation of fragment area, in image quality, and in computational speed.
Thus, a need exists for a rasterization method that can produce high-quality anti-aliased images while minimizing the additional overhead computations needed to support such anti-aliasing.